package mx.itesm.ccm.compu.gui;

import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import mx.itesm.ccm.compu.beans.DIA_SEMANA;
import mx.itesm.ccm.compu.beans.Grupo;
import mx.itesm.ccm.compu.dao.ContextHelper;
//import mx.itesm.ccm.compu.gui.PanelSeleccionGrupo;
import mx.itesm.ccm.compu.gui.AsesoriasApplication;
import mx.itesm.ccm.compu.service.GrupoService;


import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItem;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Select;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Table.ColumnGenerator;
import com.vaadin.ui.Table.TableDragMode;
import com.vaadin.ui.Window.Notification;

public class PanelProfesor extends Panel {
	
	
	Logger log = LoggerFactory.getLogger(PanelProfesor.class);
	private final TextField periodo = new TextField("Periodo");
	private final Panel informacion = new Panel();
	private final BeanItemContainer<Grupo> container = new BeanItemContainer<Grupo>(Grupo.class);
	
	public PanelProfesor(){
		super();
		init();
	}
	
	private void init(){
		log.debug("En el metodo init del prof");
		VerticalLayout layout = new VerticalLayout();
		layout.setImmediate(true);
		layout.setSpacing(true);
		
		final HorizontalLayout periodoLayout = new HorizontalLayout();
		periodoLayout.setImmediate(true);
		periodoLayout.setSpacing(true);
				
		periodo.setImmediate(true);
		
		periodoLayout.addComponent(periodo);
		
	    ArrayList<Grupo> grs = new ArrayList<Grupo>();
	    
	    container.addAll(grs);
		
		Button seleccionar = new Button("Seleccionar", new ClickListener() {
			
			
			//todo obtener de la misma manera que los panelAlumno 
			public void buttonClick(ClickEvent event) {
			
				container.removeAllItems();
				informacion.removeAllComponents();
			
				
				if(periodo.getValue()!=null && !periodo.getValue().equals("")){

					String per = periodo.getValue().toString();
					String user = getApplication().getUser().toString();
					user = user.substring(1);
					try{
						log.debug("user : {}", user);
					URL url = new URL(
							"http://escolares.ccm.itesm.mx/~mobile/listas/profes.php?trm="+periodo.getValue()+"&nom="+user);
						URLConnection conn = url.openConnection();
						Reader rd = new InputStreamReader(conn.getInputStream());
						JSONTokener jt = new JSONTokener(rd);
						JSONArray res = new JSONArray(jt);
						
						rd.close();
						
						log.debug("json crns {}", res);
						boolean hayGrps = false;
						
						if (res.length() > 0) {
							
							 hayGrps = true;
							 
							 
							
							for(int i=0;i<1;i++){
								JSONObject crn = res.getJSONObject(i);
								
								log.debug("---crn {}", crn);
								
								URL urlCRN = new URL(
										"http://escolares.ccm.itesm.mx/~mobile/boleta/grupos.php?trm="+periodo.getValue()+
										"&crs="+crn.getInt("crn"));
								URLConnection connCRN = urlCRN.openConnection();
								
								Reader rdCRN = new InputStreamReader(connCRN.getInputStream());
								JSONTokener jtCRN = new JSONTokener(rdCRN);
								JSONArray resCRN = new JSONArray(jtCRN);
								
								log.debug("json resCRN {}", resCRN);
								
								rdCRN.close();
								
								
								IndexedContainer gruposData = new IndexedContainer();
								
								gruposData.addContainerProperty("Crn", String.class, "");
								
								gruposData.addContainerProperty("Materia", String.class, "");
								gruposData.addContainerProperty("Grupo", String.class, "");
								gruposData.addContainerProperty("Dia", Select.class, null);
								gruposData.addContainerProperty("Horario", TextField.class, null);
								gruposData.addContainerProperty("Guardar",        Button.class,    null);
								
								
								String tempCrn = "";
								
								final Map<String, Object> uiMap = new HashMap<String, Object>();
								for(int j=0;j<resCRN.length();j++){
									
									if(!tempCrn.equals(resCRN.getJSONObject(j).get("crn").toString())){
									
										tempCrn = resCRN.getJSONObject(j).get("crn").toString();
										final Button saveButton = new Button("Guardar");
										 saveButton.setData(resCRN.getJSONObject(j).get("crn"));
										 saveButton.addListener(new Button.ClickListener() {
										        public void buttonClick(ClickEvent event) {
										            // Get the item identifier from the user-defined data.
										        	
										        	
										            String itemId = event.getButton().getData().toString();
										            
										            
										            
										            
										            Select retriveDia = (Select)uiMap.get("dia-" + itemId);
										            TextField retriveHora = (TextField)uiMap.get("hora-" + itemId);
										            
										            JSONObject data = (JSONObject)uiMap.get("json-"+itemId);
										            
										            log.debug("guardando dia {} y time {}",retriveDia.getValue(), retriveHora.getValue());
										            
										            getWindow().showNotification("Link "+ itemId+" clicked.");
										            GrupoService grupoService = (GrupoService)ContextHelper.getBean("grupoService");
										            log.debug("grupo service ->{}", grupoService);
										            
														try {
															grupoService.guardaHorario(data, (DIA_SEMANA)retriveDia.getValue(), retriveHora.getValue().toString());
														} catch (JSONException e) {
															log.error("json error", e);
														} catch (ParseException e) {
															log.error("date parse error",e);
															
														}
												
										        } 
										    });
										// Button addButton = new Button("Nuevo horario");
										 
										 
										 Object id = gruposData.addItem();
										 gruposData.getContainerProperty(id, "Crn").setValue(resCRN.getJSONObject(j).get("crn"));
										  gruposData.getContainerProperty(id, "Materia").setValue(resCRN.getJSONObject(j).get("nommat"));
										  gruposData.getContainerProperty(id, "Grupo").setValue(resCRN.getJSONObject(j).get("grupo"));
										  
										  Select selectDia = new Select ("Select something here");
										  for(DIA_SEMANA dia : DIA_SEMANA.values()){
											  selectDia.addItem(dia);
											  
										  }
										  
										
										  
									
										  TextField horario = new TextField("horario");
										  uiMap.put("dia-" + tempCrn, selectDia);
										  uiMap.put("hora-" + tempCrn, horario);
										  uiMap.put("json-" +tempCrn, resCRN.getJSONObject(j));
										 
										  
										  
										  gruposData.getContainerProperty(id, "Dia").setValue(selectDia);
										  gruposData.getContainerProperty(id, "Horario").setValue(horario);
										  gruposData.getContainerProperty(id, "Guardar").setValue(saveButton);
										  log.debug("" + 	resCRN.getJSONObject(j));
									}
									
								}
								
								
								
								
								
								Table grupos = new Table("Grupos");
								grupos.setContainerDataSource(gruposData);
								 //contactList.setVisibleColumns(visibleCols);
								grupos.setSelectable(true);
								grupos.setImmediate(true);
								grupos.setWidth(90, Table.UNITS_PERCENTAGE);
								grupos.setColumnReorderingAllowed(false);
							    grupos.setSortDisabled(false);
							    grupos.setSelectable(true);
							    grupos.setDragMode(TableDragMode.NONE);
							    
							    periodoLayout.addComponent(grupos);

								
							}
							
							if(hayGrps){
								getApplication().getMainWindow().showNotification("Grupos", "Seleccione un grupo.", Notification.TYPE_HUMANIZED_MESSAGE);
							}
							else{
								getApplication().getMainWindow().showNotification("Grupos", "No se encontraron grupos para mostrar.", Notification.TYPE_HUMANIZED_MESSAGE);
							}
							
						}
						else{
							getApplication().getMainWindow().showNotification("Revise los campos", "El profesor no tiene grupos en ese periodo.", Notification.TYPE_HUMANIZED_MESSAGE);
						}
						
					}
					catch(Exception e){
						e.printStackTrace();
						getApplication().getMainWindow().showNotification("Servicio no disponible.", "Intente màs tarde, por favor.", Notification.TYPE_WARNING_MESSAGE);
					}
				}
				else{
					getApplication().getMainWindow().showNotification("Revise los campos", "Proporcione un periodo", Notification.TYPE_HUMANIZED_MESSAGE);
				}
				
			}
		});
		
		periodoLayout.addComponent(seleccionar);
		
		layout.addComponent(periodoLayout);
		
	
		this.addComponent(layout);
		
	}
	
	public void reinit(){
		periodo.setValue("");
		informacion.removeAllComponents();
		container.removeAllItems();
	}
	
	private void saveHorario(){
		


	}

}
